#!/bin/bash

# 配置部分
SERVER_IP="192.168.0.1"
REDIS_PASSWORD="yourpassword"  # 集群的密码
REDIS_IMAGE="redis:7.0"        # 使用的 Redis 镜像版本
REDIS_NODES=("redis-node-1" "redis-node-2" "redis-node-3" "redis-node-4" "redis-node-5" "redis-node-6")
REDIS_PORTS=("7001" "7002" "7003" "7004" "7005" "7006")
#CLUSTER_PORTS=("17001" "17002" "17003" "17004" "17005" "17006")
CONFIG_DIR="conf"  # 配置文件存放目录
DATA_DIR="data"      # 数据存放目录


# 1.为每个 Redis 节点创建配置文件和数据目录
echo "1、创建conf和data目录，创建redis.conf配置文件..."
for i in "${!REDIS_NODES[@]}"; do
  NODE=${REDIS_NODES[$i]}
  PORT=${REDIS_PORTS[$i]}
  CLUSTER_PORT=1$PORT
  
  # 创建配置文件目录
  NODE_CONFIG_DIR="$PORT/$CONFIG_DIR"
  NODE_DATA_DIR="$PORT/$DATA_DIR"
  
  mkdir -p $NODE_CONFIG_DIR
  mkdir -p $NODE_DATA_DIR
  
  # 创建 redis.conf 配置文件
  cat <<EOL > $NODE_CONFIG_DIR/redis.conf
# Redis 配置文件
port $PORT
protected-mode no
masterauth $REDIS_PASSWORD
requirepass $REDIS_PASSWORD
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 5000
cluster-announce-ip $SERVER_IP
cluster-announce-port $PORT
cluster-announce-bus-port $CLUSTER_PORT
appendonly yes
dir /data
EOL
done

# 2. 创建 Docker Compose 配置文件
echo "2、创建 Docker Compose 配置文件..."
cat <<EOF > docker-compose.yml
version: '3'
services:
EOF

# 为每个节点添加服务定义
for i in "${!REDIS_NODES[@]}"; do
  NODE=${REDIS_NODES[$i]}
  PORT=${REDIS_PORTS[$i]}
  CLUSTER_PORT=1$PORT
  NODE_CONFIG_DIR="$PORT/$CONFIG_DIR"
  NODE_DATA_DIR="$PORT/$DATA_DIR"
  
  cat <<EOF >> docker-compose.yml
  $NODE:
    image: $REDIS_IMAGE
    container_name: $NODE
    restart: always
    ports:
      - "$PORT:$PORT"
      - "$CLUSTER_PORT:$CLUSTER_PORT"
    environment:
      - REDIS_PASSWORD=$REDIS_PASSWORD
    volumes:
      - ./$NODE_CONFIG_DIR/redis.conf:/usr/local/etc/redis/redis.conf
      - ./$NODE_DATA_DIR:/data
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    networks:
      - redis-cluster
EOF
done

# 添加网络配置
cat <<EOF >> docker-compose.yml
networks:
  redis-cluster:
    driver: bridge
EOF

# 3. 启动 Redis 容器
echo "3、启动 Redis 容器..."
docker compose up -d

# 4. 等待容器启动完成
echo "4、等待 Redis 容器启动..."
sleep 10  # 可以根据需要调整等待时间

# 5. 创建 Redis 集群
echo "5、创建 Redis 集群..."

docker exec -it ${REDIS_NODES[0]} redis-cli -a $REDIS_PASSWORD --cluster create \
  $SERVER_IP:7001 \
  $SERVER_IP:7002 \
  $SERVER_IP:7003 \
  $SERVER_IP:7004 \
  $SERVER_IP:7005 \
  $SERVER_IP:7006 \
  --cluster-replicas 1 \
  --cluster-yes

# 6. 设置每个节点的密码
echo "6、为每个节点设置密码..."
for i in "${!REDIS_PORTS[@]}"; do
  PORT=${REDIS_PORTS[$i]}
  echo "为 $PORT 设置密码..."
  docker exec -it ${REDIS_NODES[0]} redis-cli -h $SERVER_IP -p $PORT -a $REDIS_PASSWORD \
    CONFIG SET requirepass $REDIS_PASSWORD
done

# 7. 验证集群密码
echo "7、验证集群密码..."
docker exec -it ${REDIS_NODES[0]} redis-cli -h $SERVER_IP -p ${REDIS_PORTS[0]}  -a $REDIS_PASSWORD PING

# 8. 验证集群存取key
echo "8、验证集群存取key..."

sleep 5

docker exec -it ${REDIS_NODES[0]} redis-cli -h $SERVER_IP -c -p ${REDIS_PORTS[0]} -a $REDIS_PASSWORD SET testkey "test"

docker exec -it ${REDIS_NODES[0]} redis-cli -h $SERVER_IP -c -p ${REDIS_PORTS[1]} -a $REDIS_PASSWORD GET testkey

docker exec -it ${REDIS_NODES[0]} redis-cli -h $SERVER_IP -c -p ${REDIS_PORTS[1]} -a $REDIS_PASSWORD DEL testkey

echo "------Redis 集群创建完成，密码设置成功。---------"
